home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 19 / CU Amiga Magazine's Super CD-ROM 19 (1998)(EMAP Images)(GB)[!][issue 1998-02].iso / CUCD / Programming / LEDA / prog / graphics / voronoi_seg.c < prev    next >
C/C++ Source or Header  |  1994-08-05  |  4KB  |  226 lines

  1. #include <LEDA/voronoi.h>
  2. #include <LEDA/graph_alg.h>
  3. #include <LEDA/d_array.h>
  4. #include <LEDA/window.h>
  5.  
  6.  
  7.  
  8.  
  9. static  int segments_to_points(list<segment>& in, 
  10.                                list<point>& out, 
  11.                                d_array<point,segment>& D, double dist)
  12.   int count = 0;
  13.   segment s;
  14.  
  15.   forall(s,in)
  16.   { int n = int(s.length()/dist);
  17.     count = count + n +1;
  18.     double dx = (s.xcoord2() - s.xcoord1())/n;
  19.     double dy = (s.ycoord2() - s.ycoord1())/n;
  20.     double x  = s.xcoord1();
  21.     double y  = s.ycoord1();
  22.  
  23.     out.append(s.start());
  24.     D[s.start()] = s;
  25.  
  26.     for(int i = 0; i<n; i++)
  27.     {  x += dx + 0.001 * rrandom();
  28.        y += dy + 0.001 * rrandom();
  29.        point p(x,y);
  30.        D[p] = s;
  31.        out.append(p);
  32.      }
  33.  
  34. /*
  35.     out.append(s.end());
  36.     count++;
  37. */
  38.  
  39.    }
  40.  
  41.   out.permute();
  42.  
  43.  return count;
  44.  
  45. }
  46.  
  47. static  int polygons_to_points(list<polygon>& in, 
  48.                               list<point>& out, 
  49.                               d_array<point,segment>& D, int pixdist)
  50.  
  51. { polygon p;
  52.   int count = 0;
  53.  
  54.   forall(p,in)
  55.   { list<segment> sl = p.segments();
  56.     count += segments_to_points(sl,out,D,pixdist);
  57.    }
  58.   return count;
  59.  
  60.  }
  61.  
  62. /*
  63.  
  64. static  int circles_to_points(list<circle>& in, 
  65.                               list<point>& out, 
  66.                               d_array<point,circle>& D, double dist)
  67.   int count = 0;
  68.   circle s;
  69.  
  70.   forall(s,in)
  71.   { point c = s.center();
  72.     double r = s.radius();
  73.     int n = int(6.283 * r/dist);
  74.     count = count + n +1;
  75.     double alpha = 0;
  76.     double d = 6.283/n;
  77.  
  78.     for(int i = 0; i<n; i++)
  79.     {  point p = c.translate(alpha,r + 0.0001 * rrandom());
  80.        alpha += d;
  81.        D[p] = s;
  82.        out.append(p);
  83.      }
  84.    }
  85.  
  86.   out.permute();
  87.  
  88.  return count;
  89.  
  90. }
  91.  
  92. */
  93.  
  94.  
  95.  
  96. void VORONOI_SEG(list<segment>& sites, double R,GRAPH<point,point>& G, 
  97.                                                              int pixdist = 10)
  98.   list<point> pl;
  99.   d_array<point,segment> D;
  100.  
  101.   segments_to_points(sites,pl,D,pixdist);
  102.  
  103.   VORONOI(pl,R,G);
  104.  
  105.  
  106.   // eliminate edges intersecting segments
  107.  
  108.   list<edge> el;
  109.   edge e;
  110.   point p;
  111.  
  112.   forall_edges(e,G)  
  113.   { segment s = D[G[e]];
  114.     if (s.intersection(segment(G[source(e)],G[target(e)]),p)) el.append(e);
  115.    }
  116.  
  117.   forall(e,el) G.del_edge(e);
  118.  
  119.  
  120.  }
  121.  
  122.  
  123.  
  124. main()
  125. {
  126.  
  127.  window W;
  128.  
  129.  W.init(0,1000,0);
  130.  
  131.   segment s;
  132.   circle  c;
  133.   polygon p;
  134.  
  135.   double R = 1000;
  136.  
  137.   list<point>   pl;
  138.   list<segment> sl;
  139.   list<circle>  cl;
  140.   list<polygon> Pl;
  141.  
  142.   while ( W >> s ) 
  143.   { W << s;
  144.     sl.append(s);
  145.    }
  146.  
  147. /*
  148.   while ( W >> c ) 
  149.   { W << c;
  150.     cl.append(c);
  151.    }
  152.  
  153.   while ( W >> p ) 
  154.   { W << p;
  155.     Pl.append(p);
  156.    }
  157.  
  158. */
  159.  
  160.   int n = 10;
  161.  
  162.   cout << "Computing Voronoi diagram\n";
  163.   newline;
  164.  
  165.  
  166.   GRAPH<point,point> G;
  167.  
  168.     d_array<point,segment> D;
  169.     d_array<point,circle> D2;
  170.   
  171.     int count = segments_to_points(sl,pl,D,n/W.scale());
  172.  
  173.             //+ circles_to_points(cl,pl,D2,n)
  174.             //+ polygons_to_points(Pl,pl,D,n);
  175.  
  176.     cout << count << " points generated.\n";
  177.     newline;
  178.  
  179.  
  180.     pl.append(point(-5000,-5000));
  181.     pl.append(point(-5000,5000));
  182.     pl.append(point(5000,5000));
  183.     pl.append(point(5000,-5000));
  184.  
  185.   
  186.     VORONOI(pl,R,G);
  187.  
  188.     edge e;
  189.  
  190.  
  191. /*
  192.     forall_edges(e,G) W.draw_segment(G[source(e)], G[target(e)]);
  193.     W.read_mouse();
  194. */
  195.  
  196.     // eliminate edges intersecting segments
  197.  
  198.     list<edge> el;
  199.  
  200.     edge_array<edge> rev(G);
  201.  
  202.     compute_correspondence(G,rev);
  203.  
  204.     edge_array<int> deleted(G,false);
  205.   
  206.     forall_edges(e,G)  
  207.      if (!deleted[e])
  208.      { segment s = D[G[e]];
  209.        segment t = segment(G[source(e)], G[target(e)]);
  210.        point p;
  211.        if (s.intersection(t,p)) deleted[e] = deleted[rev[e]] = true;
  212.       }
  213.  
  214.     W.set_line_width(2);
  215.  
  216.     forall_edges(e,G) 
  217.         if (!deleted[e]) W.draw_segment(G[source(e)], G[target(e)],blue);
  218.  
  219.     W.read_mouse();
  220.  
  221.     return 0;
  222. }
  223.